import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import LinearRegression,Ridge
import jieba
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import TruncatedSVD
import warnings
warnings.filterwarnings('ignore')

data = pd.read_excel('datasets_ML2/纪录片播放量.xls',index_col='片名')
print(data.info())

del data['标签']
del data['上传日期']

def f(s):
    str = '万'
    if str in s:
        return float(s[0:-1])*10000 #切片 0：-1 包前不包后
    else:
        return float(s)

col = ['播放数','弹幕数','收藏数']  # 分别对有可能存在‘万’字的数据进行修改调整

for i in col:
    data[i] = data[i].map(f)  # 使用map方法将上述所表示的三列数据进行数值调整

print(data.info())
print(data['播放数'].value_counts())

# 对简介信息进行数据挖掘
data['简介'] = data['简介'].map(lambda x:jieba.lcut(x))  #使用精确分词模式，将特征中的信息进行中文分词，简介中的信息是一个列表
data['简介'] = data['简介'].map(lambda x:[i for i in x if len(i) > 1])  # 返回的是一个列表， 后续使用特征词进行处理，认为一个字的分词形式对于后续处理模型没有作用，删除掉
print(data['简介'].head())
stop = pd.read_csv('datasets_ML2/stopwords.txt',sep='\n\t',engine='python',encoding='utf-8') # 分隔符\n\t 以及常见单词
print(stop.head())

data['简介'] = data['简介'].map(lambda x:[i for i in x if i not in stop]) # 如果特征中的单词不属于停用词，进行保留，否则去除
data['简介'] = data['简介'].map(lambda x:' '.join(i for i in x))  # 将处理后的特征拼接成一个字符串，每个单词之间使用空格连接
print(data['简介'].head())

# 将所有样本单词转化成一个列表
list_data = data['简介'].tolist() # 首先转化为一个列表  变成list结构 每个元素是一句话

# 数据预处理
x1 = CountVectorizer().fit_transform(list_data)
pc = TruncatedSVD(n_components=20)   # 设置降为10个维度
x1 = pc.fit_transform(x1)
print("x1:", x1.shape)

del data['简介']
print('去除简介列')

target = ['播放数']  # 标签
feature = [x for x in data.columns if x not in target]  # 特征

data[target] = np.log(data[target])

data[feature] = StandardScaler().fit_transform(data[feature]) # 数据进行标准化处理

y = data.loc[:,target]
x2 = data.loc[:,feature].iloc[:,:].values

x = np.concatenate((x1,x2),axis=1) # 合并数据 x1就是简介后的数据 （向量化）

trainx,testx,trainy,testy = train_test_split(x,y,test_size=0.3,random_state=123) # 划分数据集

l2 = Ridge()
param_grid = {'alpha': [0.1, 1, 10, 100, 1000, 10000]}
model = GridSearchCV(l2, param_grid=param_grid, cv=10)
model.fit(trainx, trainy)
print(model.best_params_)
print(model.score(testx, testy))
